home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™94 / Talks & Papers / Timothy Knox / yerk 3.66 / Asm source / ic2 < prev    next >
Text File  |  1994-06-24  |  6KB  |  358 lines

  1. \ IC2 - Build the actual codes and return lengths of the instructions.
  2. \  9/85 RW Split off from instClasses
  3. \  3/06/86  GDC Fixed type 20, MOVEM
  4. \  7/10/86  mrh Fixed type 24, CALL for branches to this type of instruction
  5. \  1/16/94    rfl fixed type 20 to use mrh revmask, so that movem now works
  6.  
  7. \ TYPE14 - MOVE instruction
  8. \  the bad one. and I do mean Bad ( Leroy Brown bad )
  9.  
  10. :CLASS type14 <super machInst
  11.  
  12. :M BUILD:       { \ work flag size -- }
  13.     op1 getOp
  14.     op2 getOp
  15.     true -> flag
  16.     mode: op1 sr-type =
  17.     IF
  18.         false -> flag
  19.            sr>-code -> work
  20.            ea: op2 work or w,
  21.     THEN
  22.     mode: op2 sr-type =
  23.     IF
  24.         false -> flag
  25.            >sr-code -> work
  26.            ea: op1 work or w,
  27.     THEN
  28.     mode: op2 ccr-type =
  29.     IF
  30.         false -> flag
  31.             ccr-code -> work
  32.            ea: op1 work or w,
  33.     THEN
  34.     mode: op2 usp-type =
  35.     IF
  36.         false -> flag
  37.            usp-code -> work
  38.            reg: op1 work or w,
  39.     THEN
  40.     mode: op1 usp-type =
  41.     IF
  42.         false -> flag
  43.            usp-code -> work
  44.            reg: op2 work or -> work
  45.            8 ++> work
  46.            work w,
  47.     THEN
  48.     flag
  49.     IF
  50.         opSize
  51.         CASE
  52.             0 OF 1 -> size ENDOF
  53.             1 OF 3 -> size ENDOF
  54.             2 OF 2 -> size ENDOF
  55.         ENDCASE
  56.         get: bytecode -> work
  57.         Size 12 << work or -> work
  58.         reg: op2 9 << work or -> work
  59.         mode: op2 7 min 6 << work or -> work
  60.         ea: op1 work or -> work
  61.         work w,
  62.         op1 compIdxMode
  63.         op2 compIdxMode
  64.     THEN
  65. ;M
  66.  
  67. :M LENGTH:      { \ len -- len }
  68.     op1 getOp
  69.     op1 get: srcMask check
  70.     op2 getOp
  71.     op2 get: dstMask check
  72.     mode: op1 usp-type = mode: op2 1 = not and
  73.     mode: op2 usp-type = mode: op1 1 = not and or
  74.     IF
  75.            208 asmError
  76.     THEN
  77.     1 -> len
  78.     op1 modesize ++> len
  79.     op2 modesize ++> len
  80.     len
  81. ;M
  82.  
  83. ;CLASS
  84.  
  85. \ TYPE15 - MOVEQ. e.g. MOVEQ
  86. :CLASS type15 <super machInst
  87.  
  88. :M BUILD:       { \ work -- }
  89.     op1 getOp
  90.     op2 getOp
  91.     get: bytecode
  92.     value: op1 255 min 0 max or
  93.     reg: op2 9 << or
  94.     w,
  95. ;M
  96.  
  97. :M LENGTH:      ( -- len )
  98.     op1 getOp
  99.     op1 get: srcMask check
  100.     op2 getOp
  101.     op2 get: dstMask check
  102.     1
  103. ;M
  104.  
  105. ;CLASS
  106.  
  107. \ TYPE16 - TRAP, e.g. TRAP #12
  108. :CLASS type16 <super machInst
  109.  
  110. :M BUILD:
  111.     op1 getOp
  112.     get: bytecode
  113.     value: op1 15 min 0 max or
  114.     w,
  115. ;M
  116.  
  117. :M LENGTH:
  118.     op1 getOp
  119.     op1 get: srcMask check
  120.     1
  121. ;M
  122.  
  123. ;CLASS
  124.  
  125. \ TYPE18 - MOVEP
  126. :CLASS type18 <super machInst
  127.  
  128. :M LENGTH:       ( -- len )
  129.     op1 getOp
  130.     op1 get: srcMask check
  131.     op2 getOp
  132.     op2 get: dstMask check
  133.     1
  134.     op1 modesize +
  135.     op2 modesize +
  136. ;M
  137.  
  138. :M BUILD:     { \ work mode dreg areg aOp -- }
  139.     op1 getOp
  140.     op2 getOp
  141.     mode: op1 0=
  142.     IF
  143.         opSize 2 =
  144.         IF
  145.                7 -> mode
  146.         ELSE
  147.                6 -> mode
  148.         THEN
  149.            reg: op1 -> dreg
  150.         reg: op2 -> areg
  151.         op2 -> aOp
  152.     ELSE
  153.         opSize 2 =
  154.         IF
  155.             5 -> mode
  156.         ELSE
  157.             4 -> mode
  158.         THEN
  159.         reg: op2 -> dreg
  160.         reg: op1 -> areg
  161.         op1 -> aOp
  162.     THEN
  163.     get: bytecode -> work
  164.     dreg 9 << work or -> work
  165.     mode 6 << work or -> work
  166.     areg work or -> work
  167.     work w,
  168.     aOp compidxmode
  169. ;M
  170.  
  171. ;CLASS
  172.  
  173. \ TYPE19 - DBCC, etc.
  174. :CLASS type19 <super machInst
  175.  
  176. :M BUILD:
  177.     op1 getOp
  178.     op2 getOp
  179.     get: bytecode
  180.     reg: op1 or
  181.     w,
  182.     op2 compIdxMode
  183. ;M
  184.  
  185. :M LENGTH:
  186.     op1 getOp
  187.     op1 get: srcMask check
  188.     op2 getOp
  189.     op2 get: dstMask check
  190.     2
  191. ;M
  192.  
  193. ;CLASS
  194.  
  195. \ TYPE20 - MOVEM
  196. :CLASS type20 <super machInst
  197.  
  198. :M BUILD:    { \ opDesc regMask drFlag -- }
  199.     msg" build moveMsg"
  200.     op1 getOp
  201.     mode: op1 0= mode: op1 1 = or
  202.     IF                           \ register list in operand 1
  203.         msg" exec IF"
  204.         op1 false buildRegMask -> regMask
  205.                 \ make register mask. Flag always 1.
  206.         op2 getOp
  207.         0 -> drFlag
  208.         ea: op2
  209.     ELSE                         \ register list in operand 2
  210.         msg" exec ELSE"
  211.         1 -> drFlag
  212.         nextToken drop
  213.         op2 getOp
  214.         op2 false buildRegMask -> regMask
  215.         ea: op1
  216.     THEN
  217.     ( ea in stack )  get: bytecode  or
  218.     drFlag 10 << or
  219.     opSize 1 max 1- 6 << or w,
  220.     regMask
  221.     mode: op2 4 = IF  revMask  THEN        \ Reverse mask if predecrement
  222.     val" regmask is " w,
  223.     op1 compidxmode
  224.     op2 compidxmode
  225. ;M
  226.  
  227. :M LENGTH:     { \ len -- len }
  228.     2 -> len
  229.     op1 getop
  230.     mode: op1  2-  0<
  231.     IF
  232.         op1 false buildRegMask drop
  233.         op2 getop
  234.         op2 modesize ++> len
  235.     ELSE
  236.         op2 getop
  237.         op1 modesize ++> len
  238.         THEN
  239.     len
  240.     \ Force input of a new line.
  241.     0 -> tiblen 0 -> pos
  242. ;M
  243.  
  244. ;CLASS
  245.  
  246. \ TYPE21 - UNLK
  247. :CLASS type21 <super machInst
  248.  
  249. :M BUILD:
  250.     op1 getOp
  251.     get: bytecode
  252.     reg: op1 or
  253.     w,
  254. ;M
  255.  
  256. :M LENGTH:
  257.     op1 getOp
  258.     op1 get: srcMask check
  259.     1
  260. ;M
  261.  
  262. ;CLASS
  263.  
  264. \ TYPE22 - ADDX, SUBX, CMPM
  265. :CLASS type22 <super machInst
  266.  
  267. :M BUILD:       { \ work -- }
  268.     op1 getOp
  269.     op2 getOp
  270.     get: bytecode -> work
  271.     reg: op1 work or -> work
  272.     opsize 6 << work or -> work
  273.     reg: op2 9 << work or -> work
  274.     mode: op1 4 =
  275.     IF
  276.         8 work or -> work
  277.     THEN
  278.     work w,
  279. ;M
  280.  
  281. :M LENGTH:      { \ len -- len }
  282.     op1 getOp
  283.     op1 get: srcMask check
  284.     op2 getOp
  285.     op2 get: dstMask check
  286.     mode: op1 mode: op2 = not 
  287.     IF
  288.         207 asmError
  289.     THEN
  290.     1 -> len
  291.     op1 modesize ++> len
  292.     op2 modesize ++> len
  293.     len
  294. ;M
  295.  
  296. ;CLASS
  297.  
  298. :CLASS type23 <super machInst
  299.  
  300. :M LENGTH:
  301.     0
  302.     tiblen -> pos
  303. ;M
  304.  
  305. :M BUILD:
  306.     tiblen -> pos
  307. ;M
  308.  
  309. ;CLASS
  310.  
  311. :CLASS type24 <SUPER machInst
  312.  
  313. :M LENGTH:
  314.     1
  315.     tiblen -> pos
  316. ;M
  317.  
  318. :M BUILD:
  319.     nextToken drop 
  320.     get: token AsmCall
  321. ;M
  322.  
  323. ;CLASS
  324.  
  325. \ TYPE26 - Sized instruction with single ea operand, e.g. NOT, CLR, NEG
  326. :CLASS type26 <SUPER machinst
  327.  
  328. :M LENGTH:
  329.     op1 getOp
  330.     op1 get: srcMask check
  331.     1 op1 modesize +
  332. ;M
  333.  
  334. :M BUILD:
  335.     op1 getOp
  336.     get: bytecode ea: op1 or
  337.     opSize 6 << or w,
  338.     op1 compidxmode
  339. ;M
  340.  
  341. ;CLASS
  342.  
  343. :CLASS type27 <SUPER machinst
  344.  
  345. :M LENGTH:
  346.     op1 getOp
  347.     op1 get: srcMask check
  348.     2
  349. ;M
  350.  
  351. :M BUILD:
  352.     op1 getOp
  353.     get: bytecode w,
  354.     value: op1 w,
  355. ;M
  356.  
  357. ;CLASS
  358.